std::string COW 机制下的线程安全问题

您所在的位置:网站首页 cpp 线程 std::string COW 机制下的线程安全问题

std::string COW 机制下的线程安全问题

2023-11-20 20:08| 来源: 网络整理| 查看: 265

众所周知 C++ STL 容器是不保证线程安全的,不过对于 vector, list 这类容器来说,由于其底层实现很简单直接,我们可以较为容易地分析出什么时候多线程并发操作时可以不用加锁,什么时候需要加锁 —— 一般来说纯粹的并发读操作是可以不用加锁的。

然而 string 是个很奇特的异类,在 5.x 之前的老版本 GCC 上,由于 string 的实现使用了 COW 优化,这使得 string 的线程安全问题变得极为玄学。这也是 GCC 5.x 后引入了新的 string 实现放弃了 COW 的重要原因之一。

本文就来讨论下 string 在 COW 机制下线程安全方面的一些坑。

std::string COW 机制概述

string 的 COW 实现下,其自身的成员变量很简单,只有一个指针,指向堆上的一片内存区域。这片内存的结构是这样的:

string_heap_struct

除了实际的字符串内容及相关的长度记录外,还有一个引用计数字段,这就是 COW 机制的核心字段。

当且仅当使用拷贝构造函数或赋值运算符生成一个新的 string 时,新旧两个 string 会指向同一片内存,且其上的引用计数会加一;当某个 string 调用有修改字符串内容可能性的成员函数时,会检查引用计数,若引用计数大于 1,则将此片内存 copy 一份并将原来的引用计数减一,若引用计数降低至 0 则释放这片内存,这一行为的伪代码如下:

12345678910111213141516void COW() { if (rc == 1) { return; } malloc(); // Malloc new space memcpy(); // Copy data, new rc = 1 if (--rc


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3